import Vue from 'vue'
import axios from 'axios'
import VueAxios from 'vue-axios'

Vue.use(VueAxios, axios)
    //导入token工具包
import { getToken, saveToken } from './token'
//导入toast
import { Toast } from 'vant'

//导入路由
import router from '@/router/index.js'

//json-bigint解决大数据精度丢失问题，只能在请求响应之前处理。
import JSONbig from 'json-bigint'


//发送请求
const instance = axios.create({
    //项目基地址
    baseURL: 'http://toutiao-app.itheima.net',
    //请求时间限制
    timeout: 10000,
    // `transformResponse` 允许在将响应数据传递给 then/catch
    //在请求响应之前拿到没有解析的JSON字符串，然后对其做大数的精度处理。
    transformResponse: [function(data) {
        // 执行您想要转换数据的任何操作
        try {
            return JSONbig.parse(data)
        } catch (error) {
            if (data == '') {
                return data
            } else {
                return JSON.parse(data)
            }
        }
        // return data;
    }],
})


//添加请求拦截器，给每一个接口添加token
instance.interceptors.request.use(function(config) {
    //在发送请求之前做什么,添加默认参数，添加默认请求头
    //需要判断一下，如果有token，才加请求头
    if (getToken()) {
        config.headers = {
            Authorization: `Bearer ${getToken().token}`
        }
    }

    return config
}, function(error) {
    //对请求错误做些什么，没网络，发送请求就会错误
    return Promise.reject(error)
})


//添加相应拦截器解决401token的问题
//3、相应拦截
instance.interceptors.response.use(function(response) {
        //对相应数据做点什么,
        //response就是服务器响应的数据，return给then方法的res，也可以给服务器返回的数据添加一些数据
        // response.data.mes='添加一些东西'
        return response
    },
    async function(error) {
        //对相应错误做点什么，服务器返回的错误信息。如果不写，就会被吞噬掉
        //1.判断错误码是不是401
        if (error.response && error.response.status == 401) {
            //2、判断用户有没有token
            if (getToken()) {
                //3、如果有token,使用refresh_token刷新接口
                //3.1不能使用instance，请求刷新接口。因为一个错误的token，请求的还是错误的token
                /**
                 * （1）刷新token接口，不需要token，而需要refresh_token
                 * (2)instance会自动的在请求拦截中添加token，但是执行到这里说明token是过期了
                 * */

                try {
                    let res = await axios({
                        url: 'http://toutiao-app.itheima.net/v1_0/authorizations',
                        method: 'PUT',
                        headers: { 'Authorization': `Bearer ${getToken().refresh_token}` }
                    })

                    //4、刷新token
                    saveToken({
                            refresh_token: getToken.refresh_token,
                            token: res.data.data.token
                        })
                        //刷新成功之后，让浏览器继续发送之前的请求
                    return instance(error.config)
                } catch (error) {
                    //5、刷新失败。说明refresh_token，也过期了
                    Toast.fail('请先登录');
                    router.push({ path: '/login' })
                }


            } else {
                //4、没有token，说明没有登录，跳转登录页
                Toast.fail('请先登录');
                router.push({ path: '/login' })
            }
        } else {
            //2.不是401，说明是其他问题，例如404路径错误，这个不做处理  
        }

        //如果不是401，正常抛出异常
        return Promise.reject(error)
    })

export default instance